package com.cabolabs.xre.engine.util

import com.cabolabs.xre.core.definitions.DataType

/**
 * Se utiliza para castear Strings resueltos por HTTP a
 * tipos Java para luego transformarlos a VariableInstance.
 * 
 * @author Pablo Pazos Gutierrez <pablo.pazos@cabolabs.com>
 */
class Caster {

   /**
   * Convierte el valor (seguramente string) al tipo indicado.
   * @param value
   * @param to
   * @return
   */
   static public Object cast(Object value, DataType to)
   {
      println "cast object"
      if (to == DataType.COLLECTION)
      {
         return value // No hago nada, devuelvo la misma coleccion
      }
      
      // Si value es cualquier cosa, intento pasarlo a string y ver que onda
      // llama al otro cast
      return cast(value.toString(), to)
   }
   
   
   /**
    * Especial de cast para entrada string
    * @param value
    * @param to
    * @return
    */
   static public Object cast(String value, DataType to)
   {
      println "cast string"
      switch (to)
      {
         case to.INT32:
            // TODO: se le puede preguntar isInteger
            return Integer.parseInt(value)
         break
         case to.INT64:
            return Long.parseLong(value)
         break
         case to.FLOAT32:
            return Float.parseFloat(value)
         break
         case to.FLOAT64:
            return Double.parseDouble(value)
         break
         case to.DECIMAL:
            return new BigDecimal(value)
         break
         case to.STRING:
            return value
         break
         // TODO: Date (para Date necesito el formato!)
         case to.DATE:
            // http://groovy.codehaus.org/groovy-jdk/java/util/Date.html#parseToStringDate(java.lang.String)
            // Parse a String matching the pattern EEE MMM dd HH:mm:ss zzz yyyy containing US-locale-constants only (e.g. Sat for Saturdays). Such a string is generated by the toString method of Date
            //return Date.parseToStringDate(value)
         
            // Detecta el formato ISO 8601
            String format = com.cabolabs.xre.engine.util.DateFormats.findFormat(value)
            
            println "Caster date format: " + format
            
            java.text.DateFormat df = new java.text.SimpleDateFormat(format)
            return df.parse(value)
            
         break
         case to.BOOLEAN:
            return Boolean.parseBoolean(value)
         break
         default:
            throw new Exception('Tipo de valor no soportado: '+ to +" "+ to.clazz.getSimpleName())
      }
   }
}